package Interpretor;

import arbori.Nod;
import functii.*;
import functii.elementare.*;
import functii.trigonometrice.*;
import operatori.*;


public class CalculFunctionContext extends Context {
	private double result;

	public double getResult() {
		return result;
	}

	public void setResult(double result1) {
		result = result1;
	}

	
	public void actual(Nod nod) {
		if (nod instanceof Plus)
			actual((Plus) nod);
		if (nod instanceof Minus)
			actual((Minus) nod);
		if (nod instanceof Ori)
			actual((Ori) nod);
		if (nod instanceof Impartit)
			actual((Impartit) nod);
		if (nod instanceof Sin)
			actual((Sin) nod);
		if (nod instanceof Cos)
			actual((Cos) nod);
		if (nod instanceof Logaritm)
			actual((Logaritm) nod);
		if (nod instanceof Necunoscuta)
			actual((Necunoscuta) nod);
		if (nod instanceof Constanta)
			actual((Constanta) nod);
		if (nod instanceof Putere)
			actual((Putere) nod);
		if (nod instanceof Radical)
			actual((Radical) nod);
	}

	
	public void actual(Plus plus) {
		if (plus.getFStang() != null && plus.getFDrept() != null) {
			plus.getFStang().interpret(this);
			double s1 = result;
			plus.getFDrept().interpret(this);
			double s2 = result;

			result = s1 + s2;
		}
	}

	
	public void actual(Minus minus) {
		if (minus.getFStang() != null && minus.getFDrept() != null) {
			minus.getFStang().interpret(this);
			double s1 = result;
			minus.getFDrept().interpret(this);
			double s2 = result;

			result = s1 + s2;
		}
	}

	public void actual(Ori ori) {
		if (ori.getFStang() != null && ori.getFDrept() != null) {
			ori.getFStang().interpret(this);
			double s1 = result;
			ori.getFDrept().interpret(this);
			double s2 = result;

			result = s1 * s2;
		}
	}

	
	public void actual(Impartit impartit) {
		if (impartit.getFStang() != null && impartit.getFDrept() != null) {
			impartit.getFStang().interpret(this);
			double s1 = result;
			impartit.getFDrept().interpret(this);
			double s2 = result;
			if (s2 == 0) {
				System.exit(1);
			} else {
				result = s1 / s2;
			}
		}
	}

	
	public void actual(Constanta constanta) {
		result = constanta.getCt();
	}

	
	public void actual(Logaritm logaritm) {
		if (logaritm.getFStang() != null) {
			logaritm.getFStang().interpret(this);
			double resultT = result;
			result = Math.log(resultT);
		}
	}

	
	public void actual(Putere putere) {
	}

	
	public void actual(Radical radical) {
	}

	
	public void actual(Necunoscuta necunoscuta) {
		result = necunoscuta.getX();
	}

	
	public void actual(Sin sin) {
		if (sin.getFStang() != null) {
			sin.getFStang().interpret(this);
			double resultT = result;
			result = Math.sin(resultT);
		}
	}

	
	public void actual(Cos cos) {
		if (cos.getFStang() != null) {
			cos.getFStang().interpret(this);
			double resultT = result;
			result = Math.cos(resultT);
		}
	}
}
